package com.job.moudle1;

import java.util.Arrays;
import java.util.Calendar;
import java.util.Scanner;

public class task1 {

    /*
     * 通过Calendar类库的方式
     * 输入参数：年，月，日
     * 输出参数：返回是这一年的第几天
     */
    public static int getDay1(String[] dtStrArray){
        if(dtStrArray.length < 3)return 0; //防止传参出错，导致数组越界异常。
        int days;
        int year = Integer.parseInt(dtStrArray[0]);
        int month = Integer.parseInt(dtStrArray[1]);
        int day = Integer.parseInt(dtStrArray[2]);

        if (validateDate(year, month, day)) return 0; //日期合法性校验
        Calendar cda1 = Calendar.getInstance();
        cda1.set(Calendar.YEAR, year);
        cda1.set(Calendar.MONTH, month-1);
        cda1.set(Calendar.DATE, day);
        long timeOne = cda1.getTimeInMillis();
        cda1.set(Calendar.MONTH, 0);
        cda1.set(Calendar.DATE, 1);
        long timeTwo = cda1.getTimeInMillis();
        days = (int)((timeOne-timeTwo)/(1000 * 60 * 60 * 24) + 1);

        return days;
    }

    /*
     * 计算是否为闰年
     * 输入参数：年
     * 输出参数：返回是否为闰年
     */
    public static boolean leapYear(int year){
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }
    /*
     * 日期合法性校验
     * 输入参数：年,月，日
     * 输出参数：返回日期是否合法
     */
    public static boolean validateDate(int year, int month, int day) {
        int[] bigMonths = new int[]{4,6,9,11};
        if(year < 1900 || month < 1||month > 12 || day < 0 || day > 31 ||
                (Arrays.binarySearch(bigMonths, month) >= 0 && day > 30) ||
                (leapYear(year) && month == 2 && day >29) ||
                (!leapYear(year) && month == 2 && day >28))
        {
            System.out.println("无效的日期");
            return true;
        }
        return false;
    }
    /*
     * 通过switch循环的方式
     * 输入参数：年，月，日
     * 输出参数：返回是这一年的第几天
     */
    public static int getDay2(String[] dtStrArray){
        if(dtStrArray.length < 3)return 0; //防止传参出错，导致数组越界异常。
        int days = 0;
        int year = Integer.parseInt(dtStrArray[0]);
        int month = Integer.parseInt(dtStrArray[1]);
        int day = Integer.parseInt(dtStrArray[2]);

        if (validateDate(year, month, day)) return 0; //日期合法性校验
        switch(month - 1){
            case 11:days += 30;
            case 10:days += 31;
            case 9:days += 30;
            case 8:days += 31;
            case 7:days += 31;
            case 6:days += 30;
            case 5:days += 31;
            case 4:days += 30;
            case 3:days += 31;
            case 2:days += 28;
            case 1:days += 31;
        }
        if(leapYear(year) && month > 2)days += 1;
        return days+day;
    }

    /*
     * 通过for循环的方式
     * 输入参数：年，月，日
     * 输出参数：返回是这一年的第几天
     */
    public static int getDay3(String[] dtStrArray){
        if(dtStrArray.length < 3)return 0; //防止传参出错，导致数组越界异常。
        int days = 0;
        int year = Integer.parseInt(dtStrArray[0]);
        int month = Integer.parseInt(dtStrArray[1]);
        int day = Integer.parseInt(dtStrArray[2]);
        int[] bigMonths = new int[]{1,3,5,7,8,10,12};

        if (validateDate(year, month, day)) return 0; //日期合法性校验
        for(int i = 1; i < month; i++){
            if(Arrays.binarySearch(bigMonths, i) >= 0) days += 31;
            else if(i == 2 && leapYear(year)) days += 29;
            else if(i == 2 && !leapYear(year)) days += 28;
            else days += 30;
        }
        return days+day;
    }


    public static void main(String[] args) {
        System.out.println("**************************************************************************************");
        System.out.println("       编程题：提示用户输入年月日信息，判断这一天是这一年中的第几天并打印。                ");
        System.out.println("**************************************************************************************");
        Scanner sc = new Scanner(System.in);
        String str;
        do{
            System.out.print("请输入日期[YYYY-MM-DD]：");
            if (sc.hasNext("\\d{4}-\\d{2}-\\d{2}$")) {//正则验证是否为日期
                str = sc.next("\\d{4}-\\d{2}-\\d{2}$");//接收字符串
                break;
            } else {
                System.out.println("输入的日期格式错误,请输入正确的日期格式，例如：2020-10-29");
                System.out.println(sc.next());
            }
        }while (true);

        String[] dtStrArray = str.split("-");
        System.out.println(Arrays.toString(dtStrArray));
        System.out.println("通过Calendar的方式获取结果:" + getDay1(dtStrArray));
        System.out.println("通过switch的方式获取结果:" + getDay2(dtStrArray));
        System.out.println("通过for循环的方式获取结果:" + getDay3(dtStrArray));

        System.out.println("**********************************************");
        System.out.println("            恭喜南哥成功完成一题                ");
        System.out.println("**********************************************");
    }
}
